//#include <stdio.h>
//#include <stdlib.h>
//#include <stdbool.h>
//
//#define MAX_N 10
//#define MAX_FACTORS 10
//#define MAX_PRIME 1000
//
//int n;
//int a[MAX_N];
//int factors[MAX_N][MAX_FACTORS];
//int factorCount[MAX_N];
//bool used[MAX_PRIME + 1];
//int min_sum;
//
//void getPrimeFactors(int x, int index)
//{
//    int cnt = 0;
//    int temp = x;
//    for (int i = 2; i * i <= temp; i++) 
//    {
//        if (temp % i == 0) 
//        {
//            factors[index][cnt++] = i;
//            while (temp % i == 0) 
//            {
//                temp /= i;
//            }
//        }
//    }
//    if (temp > 1)
//    {
//        factors[index][cnt++] = temp;
//    }
//    factorCount[index] = cnt;
//}
//
//void dfs(int index, int current_sum)
//{
//    if (index == n) 
//    {
//        if (current_sum < min_sum) 
//        {
//            min_sum = current_sum;
//        }
//        return;
//    }
//    for (int i = 0; i < factorCount[index]; i++) 
//    {
//        int p = factors[index][i];
//        if (!used[p])
//        {
//            used[p] = true;
//            dfs(index + 1, current_sum + p);
//            used[p] = false;
//        }
//    }
//}
//
//int main() 
//{
//    scanf_s("%d", &n);
//    for (int i = 0; i < n; i++) 
//    {
//        scanf_s("%d", &a[i]);
//    }
//    for (int i = 0; i < n; i++) 
//    {
//        getPrimeFactors(a[i], i);
//    }
//    for (int i = 0; i <= MAX_PRIME; i++) 
//    {
//        used[i] = false;
//    }
//    min_sum = 1000000;
//    dfs(0, 0);
//    if (min_sum == 1000000)
//    {
//        printf("-1\n");
//    }
//    else 
//    {
//        printf("%d\n", min_sum);
//    }
//    return 0;
//}

#include <stdio.h>
#include <stdlib.h>

int n;
int a[10];
int out[10];
int stack[10];
int top = -1;
int in_index = 0;
int out_count = 0;
int results[20000][10];
int count_results = 0;

void dfs() 
{
    if (out_count == n) 
    {
        for (int i = 0; i < n; i++)
        {
            results[count_results][i] = out[i];
        }
        count_results++;
        return;
    }

    if (top >= 0)
    {
        int value = stack[top];
        top--;
        out[out_count] = value;
        out_count++;
        dfs();
        out_count--;
        top++;
        stack[top] = value;
    }

    if (in_index < n) 
    {
        int value = a[in_index];
        in_index++;
        top++;
        stack[top] = value;
        dfs();
        top--;
        in_index--;
    }
}

int compare(const void* a, const void* b)
{
    int* pa = (int*)a;
    int* pb = (int*)b;
    for (int i = 0; i < n; i++) 
    {
        if (pa[i] != pb[i])
        {
            return pa[i] - pb[i];
        }
    }
    return 0;
}

int main() 
{
    scanf_s("%d", &n);
    for (int i = 0; i < n; i++) 
    {
        scanf_s("%d", &a[i]);
    }

    dfs();

    qsort(results, count_results, sizeof(int) * 10, compare);

    for (int i = 0; i < count_results; i++) 
    {
        for (int j = 0; j < n; j++) 
        {
            printf("%d ", results[i][j]);
        }
        printf("\n");
    }

    return 0;
}